package com.hyronjs.jiangbiao.antrus.service;

import java.lang.reflect.Method;
import java.util.Date;

import com.hyronjs.jiangbiao.antrus.forms.Form;

/**
 * 服务的接口 使用装饰者模式嵌套封装service，达到强大的功能 ★ ★ ★注意：此处的service不等同于android自己的service ★ ★
 * ★android自己的service是另一个线程，异步操作
 * 
 * @author jiangbiao
 * 
 */
public abstract class Service {

	

	/**
	 * 被嵌套的servie
	 */
	private Service innerServie;

	public Service getInnerServie() {
		return innerServie;
	}

	public void setInnerServie(Service innerServie) {
		this.innerServie = innerServie;
	}

	public Service(Service innerServie) {
		this.setInnerServie(innerServie);
	}

	/**
	 * 真实的service的调用函数
	 * 
	 * @param form
	 *            数据集合
	 */
	public void doService(Form form) {
		doThisService(form);
		if (innerServie != null) {
			innerServie.doService(form);
		}
	}

	/**
	 * 从form中取到当前需要的变量 如果不存在则抛出异常
	 *  TODO 可以考虑不抛出，直接进入下一环节
	 */
	public String getValueFromForm(Form form, String valueName) throws Exception {
	
		Class caz = form.getClass();
		Method[] ms = caz.getMethods();
		for (int i = 0; i < ms.length; i++) {
			String name = ms[i].getName();
			if (name.startsWith("get")) {
				if(name.replace("get", "").toLowerCase().equals(valueName.toLowerCase())) {
					// Set方法的参数名
					Class[] cc = ms[i].getParameterTypes();
					if (cc.length == 1){
						// parameter type
						String type = cc[0].getName();
							// TODO目前只支持String
							if (type.equals("java.lang.String")) {
								return (String)ms[i].invoke(form, new Object[] { });
							} else if (type.equals("int")
									|| type.equals("java.lang.Integer")) {
								ms[i].invoke(form,
										new Object[] {});
							} else if (type.equals("long")
									|| type.equals("java.lang.Long")) {
								ms[i].invoke(form, new Object[] { });
							} else if (type.equals("boolean")
									|| type.equals("java.lang.Boolean")) {
								ms[i].invoke(form, new Object[] {});
							} else if (type.equals("java.util.Date")) {
									ms[i].invoke(form,
											new Object[] { });
					        }
				     }
			     }
			}
		}
				return null;
	}

	/**
	 * 调用当前的service
	 * 
	 * @param form
	 */
	public abstract void doThisService(Form form);
}
